# -*- coding: utf-8 -*-
# __author__ = 'BIN'

from selenium import webdriver
import db_intf
import log_intf
import time


# 获取数据库获取需要抓取的信息
def get_spider_site_list():
    global g_site_list
    global b_site_running
    g_site_list = []
    b_site_running = False
    conn, cur = db_intf.conn_db()
    # 关键字为空时进行全文搜索  有内容时则进行关键字搜索
    sql = "SELECT ID,SRC_WEB,SRC_LINK,TIME_OUT FROM spider_src_web WHERE TRIM(SRC_KEYWORD)='' "
    db_intf.qry_sql(cur, sql)
    if cur.rowcount > 0:
        for row in cur:
            url_list = [row[0], row[1], row[2], row[3]]
            g_site_list.append(url_list)
        print(g_site_list)
        b_site_running = True
    else:
        b_site_running = False
        log_intf.error_log('全站链接抓取：【未定义抓取信息】'+sql)
    db_intf.close_db(conn, cur)


# 全站链接信息抓取
def start_spider_site():
    # chrome设置不显示图片
    options = webdriver.ChromeOptions()
    options.add_experimental_option("prefs", {'profile.default_content_settings.images': 2})
    # 一次循环后退出浏览器，清下浏览器内存，防卡
    driver = webdriver.Chrome(chrome_options=options)   # 启用Chrome
    global spider_site_href
    spider_site_href = []
    page_list = ['>', '>>', '上一页', '下一页', '<', '<<', '高级搜索', '返回']
    # 循环关键字取值
    for site_list in g_site_list:
        # 插入数据库报台记录
        log_intf.running_log('【打开网页】'+site_list[1]+' '+site_list[2])     # 运行日志
        # driver.set_page_load_timeout(key_list[4])                            # 超时设置
        # 此处需增加屏蔽图片功能，加载图片影响速度
        driver.get(site_list[2])                                               # 打开新链接地址
        # 返回list ( driver.find_element_by_link_text 返回单条记录)
        link_content = driver.find_elements_by_tag_name("a")                     # 全站a链接
        for items in link_content:
            s_title = items.text
            s_link = items.get_attribute("href")
            # 此处处理判断是否为链接，且不为页面的数据链接
            if (s_title != None) and (s_link != None):
                if (len(s_link) > 4) and (s_title not in page_list):
                    try:
                        int(s_title)
                    except:
                        if (s_link[:4] == 'http') and (s_title != ''):
                            temp_item = [site_list[1], site_list[2], s_title, s_link]
                            spider_site_href.append(temp_item)
    # print(spider_site_href)
    if len(spider_site_href) > 0:
        insert_spider_site_db()
    time.sleep(0.3)   # 休眠0.3秒
    driver.quit()


# 组织sql语句
def insert_spider_site_db():
    for site_items in spider_site_href:
        # 组织插入spider记录表的sql语句
        try:
            # 对None为空时进行判断处理
            if (site_items != None) and (site_items != '') and (site_items[3] != ''):    # 链接有可能超长，出现异常，但不处理,实际网址不会超200个
                sql = '''insert into spider_site (src_web,src_link,src_keyword_title,src_keyword_link,create_time)
                        select \''''+site_items[0]+'''\',\''''+site_items[1]+'''\',\''''+site_items[2]+'''\',\''''+site_items[3]+'''\',NOW() from dual
                        where not exists (select id from spider_site where src_keyword_link = \''''+site_items[3]+'''\');
                        '''
                # 分开记录提交旨在解决已存在时提交不上，影响无记录数据更新
                if db_intf.update_sql(sql):
                    log_intf.running_log('【提交记录成功】'+site_items[2]+' '+site_items[3])
                else:
                    log_intf.running_log('【记录已存在 不更新数据库信息】'+site_items[2]+' '+site_items[3])
        except:
            print('异常信息', site_items)
    # 清空全局变量
    spider_site_href.clear()


# 主程序
if __name__ == '__main__':
    log_intf.mk_log()
    begin_time, end_time, debug_flag = log_intf.ini_sys_conn()     # 初始化参数
    if debug_flag == 1:
        message = '全站链接抓取：运行段时间：'+str(begin_time)+'点--'+str(end_time)+'点(显示运行日志)'
    else:
        message = '全站链接抓取：运行段时间：'+str(begin_time)+'点--'+str(end_time)+'点(不显示运行日志)'
    log_intf.running_log(message)

    get_spider_site_list()
    print('---------------------------')
    if not b_site_running:
        sMsg = "全站链接抓取：服务停止(原因：未定义抓取网站信息)"
        log_intf.error_log(sMsg)
    else:
        while b_site_running:
            i = int(time.strftime("%H", time.localtime()))
            if (i >= begin_time) and (i < end_time):
                start_time = time.time()
                start_spider_site()
                end_time = time.time()  # 记录程序结束时间
                total_time = end_time-start_time  # 计算程序执行耗时
                print("耗时：{0:.5f}秒" .format(total_time))  # 格式输出耗时
                print('---------------------------')
            else:
                log_intf.running_log("全站链接抓取：服务暂停（非运行时间段内）")
                time.sleep(60*10)  # 休眠60*10秒